/*
 * Shape.h
 *
 *  Created on: 2010-9-6
 *      Author: wenjian
 */

#ifndef SHAPE_H_
#define SHAPE_H_

#include "../../../commons.h"
#include "../../../gdiplus/gdraw.h"
#include "AbstractShape.h"

using namespace std;
using namespace Thk;
using namespace Ed;

namespace S {
  class ControlPoint;
  class WorkLayer;

  /**
   * 所有其它图形的父类型
   */
  //class Shape: public Element {
  //class Shape: public Elements { //方便实现合并功能,所以用Elements而不是Element
  class Shape: public AbstractShape {

    public:
      Shape(real x, real y, real w, real h);
      virtual ~Shape();

      /**
       * 类型ID
       */
      static unsigned long ClassId;
      /**
       * 类型检查
       */
      virtual bool isInstanceOf(unsigned long classId){
        return Shape::ClassId == classId;
      }

//      /**
//       * 宽度
//       */
//      virtual real width() const{
//        return _w;
//      }
//
//      /**
//       * 设置宽度
//       */
//      virtual void setWidth(real w){
//        if(_w != w){
//          _w = w;
//          setModified(true);
//        }
//      }

//      /**
//       * 高度
//       */
//      virtual real height() const{
//        return _h;
//      }
//
//      /**
//       * 设置高度
//       */
//      virtual void setHeight(real h){
//        if(_h != h){
//          _h = h;
//          setModified(true);
//        }
//      }

//      /**
//       * 增量移动到目标位置
//       */
//      virtual inline void moveBy(real dx, real dy){
//        setCoordinate(this->x()+dx, this->y()+dy);
//        createPath();
//      }

//      /**
//       * 返回包含元素所有可视内容的最大矩形，包括控制点，如果有
//       */
//      virtual const Gdiplus::RectF* getBoundRect();

//      /**
//       * 在outBoundRect中返回包含元素所有可视内容的最大矩形, adjustVal为调整值，如果为正值，将放大矩形，负值缩小矩形
//       */
//      virtual Gdiplus::RectF* getBoundRect(Gdiplus::RectF* outBoundRect, real adjustVal=0.0);
//      /**
//       * 在outBoundRect中返回包含元素所有可视内容的最大矩形, adjustVal为调整值，如果为正值，将放大矩形，负值缩小矩形
//       */
//      virtual Gdiplus::RectF* getBoundRect(Gdiplus::RectF* outBoundRect, real adjustVal=0.0);

      /**
       * 创建包含元素所有可视内容的最大矩形区域
       */
      virtual void createBoundRect();

      /**
       * 检查是否包含点(x, y)
       */
      virtual bool intersects(real x, real y);

      /**
       * 检查是否与元素e相交
       */
      virtual bool intersects(Element* e);

//      /**
//       * 重画与此元素相交的其它元素, 排除<code>excludeds</code>中的元素
//       */
//      virtual void redrawIntersection(const std::vector<AbstractElement*>* excludeds=NULL){
//        Element::redrawIntersection(excludeds);
//      }
//
//      /**
//       * 重画与此元素相交的元素, 包括相交元素和自己, 排除<code>excludeds</code>中的元素
//       */
//      virtual void redrawAll(const std::vector<AbstractElement*>* excludeds=NULL){
//        Element::redrawAll(excludeds);
//      }

//      /**
//       * 画控制点
//       */
//      virtual void drawControlPoints(Gdiplus::Graphics* g);

      /**
       * 调整控制点位置
       */
      virtual void adjustControlPointPosition();

//      virtual bool isControlPoint(){
//        return false;
//      }

//      /**
//       * 跟踪事件
//       */
//      virtual bool trackEvent(const Event* e);

      void setMerged(bool b){
        mergeFlag = b;
      }

      bool isMerged(){
        return mergeFlag;
      }

      /**
       * 是否是合并器
       */
      virtual bool isMerger(){
        return false;
      }

      /**
       * 改变大小
       */
      virtual void adjustSize(real dx, real dy, int cpIndex);

      /**
       * 刷新定制点光标
       */
      virtual void Shape::refreshControlPointCursor();

    protected:
      void buildControlPoint();
      void hideControlPoint();

    protected:
      virtual bool event(const Event* e);
      virtual void mouseMoveEvent(const MouseEvent* e);
      virtual void mouseLeaveEvent(const MouseEvent* e);
      virtual void mousePressEvent(const MouseEvent* e);
      virtual void mouseDoubleClickEvent(const MouseEvent* e);
      virtual void keyPressEvent(const KeyEvent* e);
      virtual void keyReleaseEvent(const KeyEvent* e);
      virtual void selectEvent(const SelectEvent* e);

      void mouseEnterEvent(const MouseEvent* e);
      void paintEvent(const PaintEvent* e);

    protected:
      //路径
      Gdiplus::GraphicsPath* path;
      //画笔
      Gdiplus::Pen* pen;
      //刷子
      Gdiplus::SolidBrush* brush;
      //选择模式下移动元素时光标
      DefaultCursor movingCursor;
      //控制点
      //vector<ControlPoint*> controlPoints;
      Elements controlPoints;
      //控制点大小
      real controlPointSize;
      //被合并标记
      bool mergeFlag;
  };

}

#endif /* SHAPE_H_ */
